//[¤[mdx][https://mdx.googlecode.com/git/script.js]@[vers_1.0_¤]¤¤¤ ...

//[¤[TeRmiNuS]@[script.js_v_1.8.7_.. xhtml]¤¤¤ ...

//========= STRICT ==========

	// ... IE ...
	["section","header","nav","menu","article","aside","footer"].forEach(function(i){document.createElement(i);});

	// ... БровЗерПоДДерЖиваетЪ @sandbox ? ... нЕнАдЁЖныЙкоНтеНтЪбезОпАсТнО ...
	function sandbox_is(){return ("sandbox" in document.createElement("iframe"));}

//========= FUTURED =========

	// ... ОпрЕдЕляЕтЪесТлиНЕтЕЁ ... !f!i ... define?spl ...
	function def_(N,D){if(typeof N !=="string"||typeof window[N]!=="undefined")return false;return !!(window[N]=D);}

//=====AnimationFrame========

requestAnimationFrame=window.requestAnimationFrame ||
	window.webkitRequestAnimationFrame ||
	window.mozRequestAnimationFrame ||
	window.oRequestAnimationFrame ||
	window.msRequestAnimationFrame ||
	function(callback,element) {window.setTimeout(callback,1000/60)}

canselAnimationFrame=window.canselAnimationFrame ||
	window.webkitCanselAnimationFrame ||
	window.mozCanselAnimationFrame ||
	window.oCanselAnimationFrame ||
	window.msCanselAnimationFrame ||
	function(once) {window.clearTimeout(once)}

//======== APP ===========

	App={};
	//def_("App",{})	// ... тОлЬкОдлЯпрИмеРА ... !d!c ...

	// ... App_tic ...
	App.once=null;	// ... instance ...
	App.tl=Date.now();	// ... starttime ...
	App.tx=1000/24;	//500;// ... mS rate ...
	App.tic=0;	// ... count ...
	App.ntic=0;	// ... count ...


	// ... App_fit ...
	App.scale_o=1;

	// ... App_debug ...
	App.otl=0;//1//0//

	// ... element ID query ... speed ... element[ID="f"] => App.f ...
	eventOn(window,"load",function (){for(i=(j=document.querySelectorAll('[id]')).length;i--;App[j[i].id]=j[i]);});

	// ... FIT ...
	eventOn(window,"load",function (){

		for(i=(fit=document.querySelectorAll (".fit")).length;i--;){
			fit[i].scale=fit[i].dataset.scale||1;// ... data-scale="..." ...
			fit[i].zoom=fit[i].dataset.zoom||1;// ... data-zoom="..." ...
			fit[i].dvs=fit[i].querySelector(".fil").style;
		}

	// ... debug ...
	if(App.otl && App.serv){
		App.serv.style.visibility="visible";//log_("ОТЛАДКА");
		App.mont.innerHTML=1000/App.tx+" fps";
	}

		if(fit.length>0) tic();// ...

	});

//======== MON ===========

function mon() {
// ...
// ... main ...

/**/
//		App.monS.innerHTML=App.scale_o;
//		App.monv.innerHTML=App.ntic;
		App.monV.innerHTML=App.tic;
//		App.monR.innerHTML=App.rate;
		App.monT.style.width=App.tx*1+"px";

		App.mont1.style.width=App.tx*1*0.7+"px";
		App.mont2.style.width=App.tx*1*0.3+"px";

		App.monr.style.width=App.tr*1+"px";
		App.monx.innerHTML=App.tr;
//		App.monT.innerHTML="Tx:"+App.tx;
//		App.monr.innerHTML=App.tr;

		App.monW.innerHTML=document.body.clientWidth;
		App.monH.innerHTML=document.body.clientHeight;

}

//======== TIC ===========

function tic() {

	var once=null;

////	requestAnimationFrame(tic,App.tx);

	clearTimeout(App.once);
	App.tn=Date.now();
	App.tr=Math.max(7,App.tx+App.tl-App.tn);
	App.once=setTimeout(tic,App.tr);
	App.tl=App.tn+App.tr;

//	if(App.ntic++<4) return;
//	App.ntic=0;

	App.tic++;

	if (App.otl) mon();

	// ... FIT ...

	for(i=fit.length;i--;){

		j=fit[i];//		j=fit;
		f=j.dvs;//		f=j.querySelector(".fil").style;

		sc_=Math.min(j.parentNode.clientWidth/j.clientWidth,j.parentNode.clientHeight/j.clientHeight);

		if (j.scale!=sc_){

			j.scale=sc_;
			f.webkitTransform=f.MozTransform=f.OTransform="scale("+j.zoom*sc_+")";

			if (App.otl){
				App.monR.innerHTML=Math.floor(App.monR.innerHTML)+1;
				App.monS.innerHTML=sc_;
			}

//			f.top=(sc_*z-1)*j.clientHeight/2+"px";
//			f.left=(50-50/sc_)+"%";
		}

	}

}

//========== DOM ===========

function $_(id_){return document.getElementById(id_);}

function getScreenWidth() {return screen.width;} //

function getScreenHeight() {return screen.height;} //

function getClientWidth() {
//	return (document.compatMode=='CSS1Compat' &&!window.opera)?document.documentElement.clientWidth:document.body.clientWidth; 
	return document.documentElement.clientWidth;
} 

function getClientHeight() {
//	return (document.compatMode=='CSS1Compat' && !window.opera)?document.documentElement.clientHeight:document.body.clientHeight; 
	return document.documentElement.clientHeight;
} 

// ... удаление дочерних элементов DOM ...
// ... добавить рекурсию ?q?c ...
function removeChilds(i){
	while(i.firstChild) i.removeChild(i.firstChild);
//	return i;
}

// ... удаление элемента DOM ...
function removeThis(i){
	removeChilds(i); //... may be no ?q ...
	i.parentNode.removeChild(i);
//	renurn i;
}

//========EVENTS===========

//<body onresize="init()">
//if (window.addEventListener) window.addEventListener("load",init, false); else window.onload=init();
//if (document.addEventListener) document.addEventListener('DOMContentLoaded', function () {window._= new mvc.controller(); });

// ... закеончить обработку события ...
function eventCancel(e){
	e = e ? e : window.event;
	if(e.stopPropagation) e.stopPropagation();
	if(e.preventDefault) e.preventDefault();
	e.cancelBubble = true;
	e.cancel = true;
	e.returnValue = false;
	return false;
}

// ... прикрепить к element событие eventName ... вызвать обработчик callback ...
function eventOn(element, eventName, callback){
//	if(typeof(element) == "string") element = document.getElementById(element);	// ... string="id" || DomElement ... eventOn(window,"load",function { ...
	if(element == null) return;
	if(element.addEventListener){
		if(eventName == 'mousewheel') element.addEventListener('DOMMouseScroll', callback, false);  
		element.addEventListener(eventName, callback, false);
	} else if(element.attachEvent) element.attachEvent("on" + eventName, callback);
}

// ... открепить от element событие eventName ... вызвать обработчик callback ...
function eventOff(element, eventName, callback){
//	if(typeof(element) == "string") element = document.getElementById(element);
	if(element == null) return;
	if(element.removeEventListener){
		if(eventName == 'mousewheel') element.removeEventListener('DOMMouseScroll', callback, false);  
		element.removeEventListener(eventName, callback, false);
	} else if(element.detachEvent) element.detachEvent("on" + eventName, callback);
}

//=====FULLscreenMODE========

window.onFullScreen=false;

function sw_FullScreen_(e_) {
	if (!window.onFullScreen){	
		if (e_.mozRequestFullScreen) e_.mozRequestFullScreen();
			else e_.webkitRequestFullScreen();
		window.onFullScreen=true;
		}else{
		if (document.mozCancelFullScreen) document.mozCancelFullScreen();
			else document.webkitCancelFullScreen();
		window.onFullScreen=false;
		}
 }
  
document.addEventListener("keydown", function(e) {
//    if (e.keyCode == 13) {
    if (!e.altKey) {
	if (window.onFullScreen) sw_FullScreen_();
//	sw_FullScreen_();
}
// }
 },true);
  
//=====Base_64========
//http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html

// Usage:
//utf8_to_b64('? a la mode'); // "4pyTIMOgIGxhIG1vZGU="
//b64_to_utf8('4pyTIMOgIGxhIG1vZGU='); // "? a la mode"

function utf8_to_b64( str ) {return window.btoa(unescape(encodeURIComponent( str )));}
 
function b64_to_utf8( str ) {return decodeURIComponent(escape(window.atob( str )));}
 
//=========JSONP===========
// ... реалИЗАциЯссАмОУниЧтоЖениЕмЪ ... :/ ...
function JSONP_get(url,func,arg){
 	var c_id,i;
// генерируем уникальный callback-id:
	do c_id ='c_'+Math.floor(Math.random() * 99999); while ($_(c_id));
// создаем элемент script:
	(i=document.createElement('script')).id=c_id;
	i.type='text/javascript';
// сообщаем серверу [c_id] скрипта ... не обязятельно , в принципе ... есТли не нужен callBack и самоуничтожение , в качестве хорошего тона ... или скрипт знает что делать ... 
	i.src=url+(url.indexOf('?')>=0 ? '&' : '?')+'this='+c_id;
//запоминаем КАЛЛбак
	i.callBack=func;
	i.retValue=arg;
// делаем запрос к серверу:
	document.querySelector('head').appendChild(i);
// АВТОуничтожение ...
	i.once=window.setTimeout(function(){try {i.parentNode.removeChild(i);} catch (e){/* ... очень хорошо ... исчез уже ... */}},7000);
/*
// можно в скрипт ответа добавить:

if(isset($_REQUEST['this'])){
echo '
	this_=$_("'.$_REQUEST['this'].'");
//	$_("targetDiv").innerHTML="result:"+this_.retValue+" ... $_("+this_.id+")";
	if(typeof this_.callBack == "function") this_.callBack(this_.retValue);
	this_.parentNode.removeChild(this_);
	';
*/

}

//<!-- /* [Copyright 11/12/2012 SanEcIn][¤¤] */-->
